package org.linuxsogood.boot.nio;

import org.junit.Test;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SocketChannel;

/**
 * @author honway.liu
 * @date 2018/9/5 下午7:29
 * @email gm100861@gmail.com
 * @blog http://linuxsogood.org
 *
 * 使用NIO完成网络通信的3个核心
 *
 * 1. 通道(Channel), 负责连接
 *      java.nio.channels.Channel 接口
 *          |-- SelectableChannel
 *              |-- SocketChannel
 *              |-- ServerSocketChannel
 *              |-- DatagramChannel
 *
 *              |-- Pipe.SinkChannel
 *              |-- Pipe.SourceChannel
 *
 * 2. 缓冲区(Buffer), 负责数据的存取
 * 3. 选择器(Selector), 是SelectableChannel的多路复用器, 用于监控SelectableChannel的IO状况
 *
 *
 * 每个channel都会对应一个buffer
 * 一个selector对应一个线程, 一个线程对应多个channel, 一个channel其实就对应了一个客户端连接
 * 程序切换到哪个channel是有事件决定的, event就是一个重要的概念
 * selector会根据不同的事件,在各个通道上切换
 * buffer就是一个内存块, 底层是一个数组
 *
 */
public class TestBlockNIO {

    /**
     * 客户端
     */
    @Test
    public void client() throws IOException {
        // 1. 获取通道
        SocketChannel socketChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 8080));

        // 2. 分配缓冲区
        ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

        while (socketChannel.read(byteBuffer) != -1) {
            byteBuffer.flip();
            socketChannel.write(byteBuffer);
            byteBuffer.clear();
        }

    }

    /**
     * 服务端
     */
    @Test
    public void server() {

    }
}
